/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package agb.Conexion;


import agb.Modelo.Archivos;
import agb.Modelo.Asistencias;
import agb.Modelo.PromedioExonerados;
import agb.Modelo.Promedios;
import agb.Modelo.PromediosExo;
import agb.Modelo.UsuarioWeb;
import agb.Modelo.Utilidades;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Vector;
/**
 *
 * @author Administrator
 */
public class NewMain {

    static List<PromediosExo> notaBimestral1 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaBimestral2 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaBimestral3 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes1 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes2 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes3 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes4 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes5 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes6 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes7 = new ArrayList<PromediosExo>();
    static List<PromediosExo> notaMes8 = new ArrayList<PromediosExo>();

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws Exception {
        long startTime = System.currentTimeMillis();        
        List<List<PromedioExonerados>> lshow = new ArrayList<List<PromedioExonerados>>();
        Utilidades oUtil = new Utilidades().GradoSeccionAlumno(584);
        List<Utilidades> listaCurso = new Utilidades().ListacursosPorNivelGrado(oUtil.getCodNivel(), oUtil.getCodGrado());        
        double pesoM = new Promedios().PesoMes(oUtil.getCodNivel());              
        double pesoB = new Promedios().PesoBimTrimestral(oUtil.getCodNivel()); 
        DecimalFormatSymbols dformater_rules = new DecimalFormatSymbols ();
        dformater_rules.setDecimalSeparator ('.');
        DecimalFormat df = new DecimalFormat("0.00", dformater_rules);
        df.setMaximumFractionDigits(2);
        List<PromediosExo> listaFinal = new ArrayList<PromediosExo>();           

              List<PromediosExo> notasGlobal = new PromediosExo().notasGlobales(584);
              llenarListas(notasGlobal);          
              List<PromediosExo> primerBimestre = notasPrimerBimestre(listaCurso, pesoM, pesoB);
              for(int j=0;j<primerBimestre.size();j++){
                  PromediosExo p = primerBimestre.get(j);
                  PromediosExo promFinal = new PromediosExo();
                  promFinal.setCurso(p.getCurso());
                  promFinal.setPromBimestre1(Double.parseDouble(df.format(p.getPromedioBimestral())));        
                  listaFinal.add(promFinal);
              }           
              List<PromediosExo> segundoBimestre = notasSegundoBimestre(listaCurso, pesoM, pesoB);
              for(int j=0;j<segundoBimestre.size();j++){
                  PromediosExo p = segundoBimestre.get(j);
                  PromediosExo actual = listaFinal.get(j);
                  actual.setPromBimestre2(Double.parseDouble(df.format(p.getPromedioBimestral())));              
              }
              List<PromediosExo> tercerBimestre = notasTercerBimestre(listaCurso, pesoM, pesoB);
              for(int j=0;j<tercerBimestre.size();j++){
                  PromediosExo p = tercerBimestre.get(j);
                  PromediosExo actual = listaFinal.get(j);
                  actual.setPromBimestre3(Double.parseDouble(df.format(p.getPromedioBimestral())));
              }          
              List<PromediosExo> cuartoBimestreProy = notasCuartoBimestreProy(listaCurso, pesoM);
              for(int j=0;j<cuartoBimestreProy.size();j++){
                  PromediosExo p = cuartoBimestreProy.get(j);
                  PromediosExo actual = listaFinal.get(j);
                  actual.setPromBimestre4Proy(Double.parseDouble(df.format(p.getPromedioBimestral())));
              }  
              List<PromedioExonerados> listaprom = new ArrayList<PromedioExonerados>();
              for(PromediosExo actual:listaFinal){
                  PromedioExonerados prom = new PromedioExonerados();
                  String estado = "";
                  boolean esExo = true;
                  System.out.print(actual.getCurso().substring(0, 4) + "     ");
                  System.out.print(actual.getPromBimestre1() + " - ");
                  if(actual.getPromBimestre1()<11){
                      estado = "NO EXONERADO";
                      esExo = false;
                  }
                  System.out.print(actual.getPromBimestre2()+ " - ");
                  if(actual.getPromBimestre2()<11){
                      estado = "NO EXONERADO";
                      esExo = false;
                  }
                  System.out.print(actual.getPromBimestre3() + " - ");
                  if(actual.getPromBimestre3()<11){
                      estado = "NO EXONERADO";
                      esExo = false;
                  }
                  System.out.print(actual.getPromBimestre4Proy()+ " - ");
                  if(actual.getPromBimestre4Proy()<11){
                      estado = "NO EXONERADO";
                      esExo = false;
                  }
                  if(esExo){
                      double nota = (actual.getPromBimestre1() + actual.getPromBimestre2() + actual.getPromBimestre3() + actual.getPromBimestre4Proy())/4;
                      if(nota<13){
                          estado = "NO EXONERADO";
                      }else{
                          estado = "EXONERADO";
                      }
                  }
                  System.out.print(estado);
                  prom.setNombreCurso(actual.getCurso());
                  prom.setPromBim1(""+actual.getPromBimestre1());
                  prom.setPromBim2(""+actual.getPromBimestre2());
                  prom.setPromBim3(""+actual.getPromBimestre3());
                  prom.setPromBim4(""+actual.getPromBimestre4Proy());
                  prom.setCondicion(estado);
                  listaprom.add(prom);
                  System.out.println();
              }
              lshow.add(listaprom);
              listaFinal.clear();              
              System.out.println("**********************************");  
              for(PromedioExonerados p:listaprom){
              if(p.getNombreCurso().equalsIgnoreCase("TUTORIA")){
                  System.out.println("entro");
                  listaprom.remove(p);
                  break;
              }                  
          }
              for(PromedioExonerados prom:listaprom){
                   System.out.println(prom.getNombreCurso());
                  System.out.println(prom.getPromBim1());
                  System.out.println(prom.getPromBim2());
                  System.out.println(prom.getPromBim3());
                  System.out.println(prom.getPromBim4());
                  System.out.println(prom.getCondicion()); 
              }
//          for(int i=0;i<lshow.size();i++){
//              List<PromedioExonerados> l = lshow.get(i);   
//              for(int j = 0;j<l.size();j++){
//                  PromedioExonerados prom = l.get(j);
//                  System.out.println(prom.getNombreCurso());
//                  System.out.println(prom.getPromBim1());
//                  System.out.println(prom.getPromBim2());
//                  System.out.println(prom.getPromBim3());
//                  System.out.println(prom.getPromBim4());
//                  System.out.println(prom.getCondicion());                  
//              }
//          }
          long endTime = System.currentTimeMillis();
          double val = (endTime - startTime) /1000.00;
          System.out.println("tiempo demora: " + val + " Segundos");
    }
     public static List<PromediosExo> notasPrimerBimestre(List<Utilidades> listaCurso, double pesoM, double pesoB){
        List<PromediosExo> LPromMesOrdShow1 = new PromediosExo().calculaPromedio(notaMes1, 3, (int)pesoM);
        List<PromediosExo> LPromMesOrdShow2 = new PromediosExo().calculaPromedio(notaMes2, 3, (int)pesoM);
        List<PromediosExo> LPromBimestral = new ArrayList<PromediosExo>();
        List<PromediosExo> NuevaListaProm = new ArrayList<PromediosExo>();
        PromediosExo notas = null;
        for(int i=0;i< listaCurso.size();i++){
            Utilidades o = listaCurso.get(i);
            notas = new PromediosExo();
            notas.setCurso(o.getNombreCurso());
            for(int j = 0; j<LPromMesOrdShow1.size();j++){
                PromediosExo P1 = LPromMesOrdShow1.get(j);
                if(P1.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes1(P1.getPromedioMes());
                }
            }
            for(int j = 0; j<LPromMesOrdShow2.size();j++){
                PromediosExo P2 = LPromMesOrdShow2.get(j);
                if(P2.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes2(P2.getPromedioMes());
                }
            }
            for(int j = 0; j<notaBimestral1.size();j++){
                PromediosExo NB = notaBimestral1.get(j);
                if(NB.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setNotaBimestral(NB.getNotaBimestral());
                }
            }
        LPromBimestral.add(notas);
        }
      NuevaListaProm = new PromediosExo().calculaPromBimestral(LPromBimestral, 1, (int)pesoB);
      return NuevaListaProm;
    }
    
    public static List<PromediosExo> notasSegundoBimestre(List<Utilidades> listaCurso, double pesoM, double pesoB){
        List<PromediosExo> LPromMesOrdShow1 = new PromediosExo().calculaPromedio(notaMes3, 3, (int)pesoM);
        List<PromediosExo> LPromMesOrdShow2 = new PromediosExo().calculaPromedio(notaMes4, 3, (int)pesoM);
        List<PromediosExo> LPromBimestral = new ArrayList<PromediosExo>();
        List<PromediosExo> NuevaListaProm = new ArrayList<PromediosExo>();
        PromediosExo notas = null;
        for(int i=0;i< listaCurso.size();i++){
            Utilidades o = listaCurso.get(i);
            notas = new PromediosExo();
            notas.setCurso(o.getNombreCurso());
            for(int j = 0; j<LPromMesOrdShow1.size();j++){
                PromediosExo P1 = LPromMesOrdShow1.get(j);
                if(P1.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes1(P1.getPromedioMes());
                }
            }
            for(int j = 0; j<LPromMesOrdShow2.size();j++){
                PromediosExo P2 = LPromMesOrdShow2.get(j);
                if(P2.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes2(P2.getPromedioMes());
                }
            }
            for(int j = 0; j<notaBimestral2.size();j++){
                PromediosExo NB = notaBimestral2.get(j);
                if(NB.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setNotaBimestral(NB.getNotaBimestral());
                }
            }
        LPromBimestral.add(notas);
        }
      NuevaListaProm = new PromediosExo().calculaPromBimestral(LPromBimestral, 1, (int)pesoB);
      return NuevaListaProm;
    }
    
    public static List<PromediosExo> notasTercerBimestre(List<Utilidades> listaCurso, double pesoM, double pesoB){
        List<PromediosExo> LPromMesOrdShow1 = new PromediosExo().calculaPromedio(notaMes5, 3, (int)pesoM);
        List<PromediosExo> LPromMesOrdShow2 = new PromediosExo().calculaPromedio(notaMes6, 3, (int)pesoM);
        List<PromediosExo> LPromBimestral = new ArrayList<PromediosExo>();
        List<PromediosExo> NuevaListaProm = new ArrayList<PromediosExo>();
        PromediosExo notas = null;
        for(int i=0;i< listaCurso.size();i++){
            Utilidades o = listaCurso.get(i);
            notas = new PromediosExo();
            notas.setCurso(o.getNombreCurso());
            for(int j = 0; j<LPromMesOrdShow1.size();j++){
                PromediosExo P1 = LPromMesOrdShow1.get(j);
                if(P1.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes1(P1.getPromedioMes());
                }
            }
            for(int j = 0; j<LPromMesOrdShow2.size();j++){
                PromediosExo P2 = LPromMesOrdShow2.get(j);
                if(P2.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes2(P2.getPromedioMes());
                }
            }
            for(int j = 0; j<notaBimestral3.size();j++){
                PromediosExo NB = notaBimestral3.get(j);
                if(NB.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setNotaBimestral(NB.getNotaBimestral());
                }
            }
        LPromBimestral.add(notas);
        }
      NuevaListaProm = new PromediosExo().calculaPromBimestral(LPromBimestral, 1, (int)pesoB);
      return NuevaListaProm;
    }
    
    public static List<PromediosExo> notasCuartoBimestreProy(List<Utilidades> listaCurso, double pesoM){
        List<PromediosExo> LPromMesOrdShow1 = new PromediosExo().calculaPromedio(notaMes7, 3, (int)pesoM);
        List<PromediosExo> LPromMesOrdShow2 = new PromediosExo().calculaPromedio(notaMes8, 3, (int)pesoM);
        List<PromediosExo> LPromBimestral = new ArrayList<PromediosExo>();
        List<PromediosExo> NuevaListaProm = new ArrayList<PromediosExo>();
        PromediosExo notas = null;
        for(int i=0;i< listaCurso.size();i++){
            Utilidades o = listaCurso.get(i);
            notas = new PromediosExo();
            notas.setCurso(o.getNombreCurso());
            for(int j = 0; j<LPromMesOrdShow1.size();j++){
                PromediosExo P1 = LPromMesOrdShow1.get(j);
                if(P1.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes1(P1.getPromedioMes());
                }
            }
            for(int j = 0; j<LPromMesOrdShow2.size();j++){
                PromediosExo P2 = LPromMesOrdShow2.get(j);
                if(P2.getCurso().equalsIgnoreCase(o.getNombreCurso())){
                    notas.setMes2(P2.getPromedioMes());
                    
                }
            }            
        LPromBimestral.add(notas);
        }
      NuevaListaProm = new PromediosExo().calculaPromBimestralProy(LPromBimestral, 1);
      return NuevaListaProm;
    }
    
    
    public static void llenarListas(List<PromediosExo> notas){
        PromediosExo actual = null;
        for(PromediosExo o:notas){
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal1());
            actual.setNota2(o.getSemanal2());
            actual.setNota3(o.getSemanal3());
            actual.setMensual(o. getMensual1());
            notaMes1.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal4());
            actual.setNota2(o.getSemanal5());
            actual.setNota3(o.getSemanal6());
            actual.setMensual(o. getMensual2());
            notaMes2.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal7());
            actual.setNota2(o.getSemanal8());
            actual.setNota3(o.getSemanal9());
            actual.setMensual(o. getMensual3());
            notaMes3.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal10());
            
            actual.setNota2(o.getSemanal11());
            actual.setNota3(o.getSemanal12());
            actual.setMensual(o. getMensual4());
            notaMes4.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal13());
            actual.setNota2(o.getSemanal14());
            actual.setNota3(o.getSemanal15());
            actual.setMensual(o. getMensual5());
            notaMes5.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal16());
            actual.setNota2(o.getSemanal17());
            actual.setNota3(o.getSemanal18());
            actual.setMensual(o. getMensual6());
            notaMes6.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal19());
            actual.setNota2(o.getSemanal20());
            actual.setNota3(o.getSemanal21());
            actual.setMensual(o. getMensual7());
            notaMes7.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNota1(o.getSemanal22());
            actual.setNota2(o.getSemanal23());
            actual.setNota3(o.getSemanal24());
            actual.setMensual(o. getMensual8());
            notaMes8.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNotaBimestral(o.getBimestral1());
            notaBimestral1.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNotaBimestral(o.getBimestral2());
            notaBimestral2.add(actual);
            actual = new PromediosExo();
            actual.setCurso(o.getCurso());
            actual.setNotaBimestral(o.getBimestral3());
            notaBimestral3.add(actual);
            
        }
        
    }


//HASTA AQUI SON LOS METODOS PARA EL CALCULO DE LOS PROMEDIOS EXONERADOS PARA LA WEB =)


     public static Vector<String> diasNoLaborables(int anio) {
        Vector<String> LAlumnos = new Vector<String>();

        Connection cn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        String sql = " ";
        try {
            cn = Conexion.getConexion();
            ps = cn.prepareStatement(sql);
            ps.setInt(1, anio);
            rs = ps.executeQuery();
            while (rs.next()) {

            }
        Conexion.cerrarPreparedStatement(ps);
        Conexion.cerrarConexion(cn);
        } catch (SQLException ex) {
            ex.printStackTrace();
            Conexion.cerrarPreparedStatement(ps);
            Conexion.cerrarConexion(cn);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return LAlumnos;
    }






    static String aunmentaCeros(StringBuffer codigo){
        for(int i=codigo.length();i<8;i++){
            codigo.insert(0, "0");
        }
        return new String(codigo);
    }
    
    public static Vector<Promedios>calculaPromTrimestral(Vector<Promedios> PromMensuales,int pesoPromMensual, int PesoBimestral){
        int peso = (pesoPromMensual * 3) + PesoBimestral;
        int nuevoPeso = peso;
        for(Promedios o: PromMensuales){
            if(o.getMes1()==0){
                peso = peso - pesoPromMensual;
            }
            if(o.getMes2()==0){
                 peso = peso - pesoPromMensual;
            }
            if(o.getMes3()==0){
                 peso = peso - pesoPromMensual;
            }
            if(o.getNotaTrimestral()==0){
                 peso = peso - PesoBimestral;
            }
            if(peso==0){
                 peso = 1;
            }
            double promBimestral = 0.0;           
            promBimestral = ((o.getMes1()* pesoPromMensual) + (o.getMes2() * pesoPromMensual) + (o.getMes3() * pesoPromMensual) + (o.getNotaTrimestral()* PesoBimestral))/peso;
            o.setPromedioTrimestral(promBimestral);
            peso = nuevoPeso;
        }
        return PromMensuales;
    }
    
    public static Vector<testNotas>OrdenarNotas(Vector<testNotas> LNotas, Vector<testNotas> LCursos){
        Vector<testNotas> NuevaLista = new  Vector<testNotas>();
        testNotas nota = null;
        for(testNotas c : LCursos){            
            nota = new testNotas();
            nota.setCurso(c.getCurso());
            System.out.println(c.getCurso());
            for(testNotas n : LNotas){
                if(n.getCurso().equals(c.getCurso())){
                    if(n.getNota1()>0){
                        nota.setNota1(n.getNota1());
                    }
                    if(n.getNota2()>0){
                        nota.setNota2(n.getNota2());
                    }
                    if(n.getNota3()>0){
                        nota.setNota3(n.getNota3());
                    }
                    if(n.getNota4()>0){
                        nota.setNota4(n.getNota4());
                    }              
                }
                
            }
            NuevaLista.add(nota);
        }
        return NuevaLista;
    
    }
    
    public static Vector<testNotas> calculaPromedio(Vector<testNotas> L, int peso){
        int nuevoPeso = peso;
        double  prom = 0.0;
        for(testNotas o :L){
            if(o.getNota1()==0){
                peso = peso - 1;               
            }
            if(o.getNota2()==0){
                peso = peso - 1;                
            }
            if(o.getNota3()==0){       
                peso = peso - 1;                   
            }     
            prom = (o.getNota1() + o.getNota2() + o.getNota3() + o.getNota4())/peso;
            o.setPromedioMes(prom);
            peso = nuevoPeso;
        }
        return L;    
    }
}